#include "Infrared.h"

Infrared::Infrared()
{
}

Infrared &Infrared::setCallback(INFRARED_CALLBACK_SIGNATURE)
{
    this->callback = callback;
    return *this;
}

void Infrared::setup()
{
    pinMode(INFRARED_ACTION_PIN, INPUT_PULLUP);
}

void Infrared::loop()
{
    long now = millis();
    int value = 0;
    // 100ms
    if (now - _check_last > 100) {
        _check_last = now;
        value = getValue();
        if (value != _value) {
            _value = value;
            // 有人的话，直接上传变化
            if (value == INFRARED_ACTION_ANYBODY) {
                if (!_nobody_flag) {
                    callback(_value);
                }
                // _nobody_flag = false;
            }
            // 无人的时候延时后再检测一次
            if (value == INFRARED_ACTION_NOBODY) {
                // 清空超时,开启无人超时检测
                _nobody_flag = true;
                _nobody_last = now;
            }  
        }
    }
    // 无人超时检测时间到, 超时检测，确认无人
    if (_nobody_flag) {
        if (now - _nobody_last > (_nobody_timeout * 1000)) {
            _nobody_last = now; // 清空超时
            if (_value == INFRARED_ACTION_NOBODY) {
                // 确认无人, 上传状态，关闭检测，
                _nobody_flag = false;
                callback(_value);
            }  
        } 
    }
}

void Infrared::setNobodyTimeout(int timeout) {
    _nobody_timeout = timeout;
}

void Infrared::check() {
    // 读取引脚
    int value = getValue();
    if (value != _value)
    {
        _value = value;
        callback(_value);
    }
}

int Infrared::getValue()
{
    int value = digitalRead(INFRARED_ACTION_PIN);
    if (value == HIGH)
    {
        return INFRARED_ACTION_ANYBODY;
    }
    else 
    {
        return INFRARED_ACTION_NOBODY;
    }
    return -1;
}
